package magent

import (
	"bufio"
	"fmt"
	"log"
	"os/exec"

	"github.com/iris-contrib/middleware/logger"
	"github.com/iris-contrib/middleware/recovery"
	"github.com/kataras/iris"
	"github.com/spf13/viper"
	"gopkg.in/mgo.v2"
)

var (
	globalSession *mgo.Session
	dbName        string
)

func initMongo(dbURL string) *mgo.Session {
	session, err := mgo.Dial(dbURL)
	if err != nil {
		log.Panic(err)
	}
	return session
}

func runCommand(c iris.WebsocketConnection) *exec.Cmd {
	cmd := exec.Command("tail -f ")
	stdout, err := cmd.StdoutPipe()
	if err != nil {
		log.Fatal(err)
	}
	scanner := bufio.NewScanner(stdout)
	go func() {
		for scanner.Scan() {
			c.EmitMessage(scanner.Bytes())
		}
	}()
	if err := cmd.Start(); err != nil {
		log.Fatal(err)
	}
	if err := cmd.Wait(); err != nil {
		log.Fatal(err)
	}
	return cmd
}

func initConfig(configPath string) error {
	viper.AddConfigPath(configPath)
	viper.SetConfigName("config")
	viper.SetConfigType("json")
	if err := viper.ReadInConfig(); err != nil {
		createErr := fmt.Errorf("Fatal error config file: %s \n", err)
		log.Println(createErr)
		return createErr
	}
	return nil
}

// CreateApp ...
func CreateApp(configPath string) (*iris.Framework, error) {
	err := initConfig(configPath)
	if err != nil {
		return nil, err
	}
	globalSession = initMongo(viper.GetString("MongoURI"))
	sqlite = initSqlite(viper.GetString("SqliteURI"))
	dbName = viper.GetString("DBName")
	app := iris.New()

	errorLogger := logger.New(logger.Config{Status: true, IP: true, Method: true, Path: true})
	app.Use(recovery.Handler)
	app.Use(errorLogger)

	app.Get("/", func(c *iris.Context) {
		c.Write("Hello World!")
	})

	app.Get("/api/magent/v1/logs", queryLogs)
	app.Get("/api/magent/v1/stats", severStatHandler)
	// app.Get("/api/magent/v1/health", queryHealth)
	// app.Post("/api/magent/v1/errlogs", notiErrorLog)

	//app.Post("/api/v1/tasks", createTask)
	//app.Get("/api/v1/tasks", queryTask)
	//app.Put("/api/v1/tasks/:taskID", updateTask)
	//app.Delete("/api/v1/tasks/:taskID", deleteTask)

	//app.Config.Websocket.Endpoint = "/ws"
	//app.Websocket.OnConnection(func(c iris.WebsocketConnection) {
	//	log.Println("Conntected.")
	//	var cmd *exec.Cmd
	//	c.OnMessage(func(message []byte) {
	//		fmt.Println(string(message))
	//		js, _ := json.NewJson(message)
	//		msgType, err := js.Get("type").String()
	//		if err != nil {
	//			log.Panic(err)
	//		}
	//		if msgType == "deploy" {
	//			taskID, err := js.Get("taskID").String()
	//			if err != nil {
	//				log.Println(err)
	//			}
	//			frontTag, err := js.Get("frontTag").String()
	//			if err != nil {
	//				log.Println(err)
	//			}
	//			backTag, err := js.Get("backTag").String()
	//			if err != nil {
	//				log.Println(err)
	//			}
	//			cmd = RunCommand(c)
	//		} else if msgType == "stop" {
	//			if err := cmd.Process.Kill(); err != nil {
	//				log.Panic(err)
	//			}
	//		}
	//	})
	//})
	return app, nil
}
